package com.cinyi.cyds.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.RenderingHints;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.AxisLocation;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.DefaultPieDataset;

public class JFreeChartHelper {
	public static final int FONT_SIZE_28 = 28 ;
	
	public static final int FONT_SIZE_22 = 22 ;
	
	public static final int FONT_SIZE_18 = 18 ;
	
	private static String DEFAULT_STORE_PATH = null ;
	
	public static String createSimpleBarChart(String destFile,String topTitle,String xTitle,String yTtile
			,CategoryDataset dataset) throws IOException{
		return createSimpleBarChart(destFile, topTitle, xTitle, yTtile, dataset, 800, 600);
	}
	
	public static String createSimpleBarChart(boolean lablevisible,String destFile,String topTitle,String xTitle,String yTtile
			,CategoryDataset dataset) throws IOException{
		return createSimpleBarChart(lablevisible,destFile, topTitle, xTitle, yTtile, dataset, 800, 600);
	}

	/**
	 * 生成图表<br>
	 * 返回的路径名
	 * @param destFile		文件名称，不包括拓展名
	 * @param topTitle		头标题
	 * @param xTitle		横向标题
	 * @param yTtile		竖向标题
	 * @param dataset		数据集
	 * @param width			图片宽度
	 * @param height		图片高度
	 * @return
	 * @throws IOException
	 */
	public static String createSimpleBarChart(String destFile,String topTitle,String xTitle,String yTtile
			,CategoryDataset dataset,int width,int height) throws IOException{
		  
	       //生成柱状图  
	       JFreeChart chart = ChartFactory.createBarChart (
	               topTitle,//"图书销售统计表",     //图表标题  
	               xTitle,//"图书",             //目录轴的显示标签  
	               yTtile ,//"销量",             //数值轴的显示标签  
	               dataset,      //数据  
	               PlotOrientation.VERTICAL,    //图表方向垂直 , PlotOrientation.HORIZONTAL, //图表方向水平  
	               true,             //是否显示图例  
	               true,            //是否显示工具提示  
	               false             //是否生成URL  
	       );  
	       //设置标题及标题字体  
	       chart.setTitle(new TextTitle(topTitle,new Font("黑体",Font.ITALIC,FONT_SIZE_28 )));  
	       //获取柱状图plot对象  
	       CategoryPlot plot = chart.getCategoryPlot() ;// (CategoryPlot) chart.getPlot();  
	       
	       //取得横轴  
	       CategoryAxis categoryAxis = plot.getDomainAxis();  
	       Font xLabelFont = new Font("宋体",Font.BOLD,FONT_SIZE_18) ;
	       //设置横轴的字体  
	       categoryAxis.setLabelFont(xLabelFont);  
	       //设置分类标签以45度倾斜  
	       categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);  
	       
	       //设置分类标签字体  
	       categoryAxis.setTickLabelFont(new Font("宋体",Font.BOLD,FONT_SIZE_22));
	       categoryAxis.setLowerMargin(0.15f);//设置距离图片左端距离此时为15%
	       categoryAxis.setUpperMargin(0.15f);//设置距离图片右端距离此时为百分之15
	       categoryAxis.setCategoryMargin(0.2);// 横轴标签之间的距离20%
	       
	       
	       //取得纵轴  y
	       NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();  
	       
	       Font yLabelFont = new Font("宋体",Font.BOLD,FONT_SIZE_18) ;
	       
	       //设置纵轴的字体  
	       rangeAxis.setLabelFont(yLabelFont);  
	       
//	       numberAxis.setNumberFormatOverride(new DecimalFormat("#0"));//显示数值
	       rangeAxis.setUpperMargin(0.1);//设置最高的一个柱与图片顶端的距离(最高柱的10%)
	       
	       rangeAxis.setLabelFont(yLabelFont);// 轴标题  
	       rangeAxis.setTickLabelFont(yLabelFont);// 轴数值  
//	       numberAxis.setLabelPaint(Color.RED) ; // 字体颜色  
	       
//	       plot.setRangeAxis(rangeAxis);  
	       
	        BarRenderer renderer = (BarRenderer) plot.getRenderer() ;//new BarRenderer();
	        // 设置柱子宽度  
	        renderer.setMaximumBarWidth(0.2);  
	        // 设置柱子高度  
	        renderer.setMinimumBarLength(0.2);  
	        // 设置柱子边框颜色  
	        renderer.setBaseOutlinePaint(Color.BLACK);  
	        
	        // 设置柱子边框可见  
	        renderer.setDrawBarOutline(true);  
	        
	        // 设置每个地区所包含的平行柱的之间距离  
	        renderer.setItemMargin(0.5);  
	        
	        chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);  
	        
	        // 显示每个柱的数值，并修改该数值的字体属性  
	        renderer.setIncludeBaseInRange(true);  
	        renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());  
	        renderer.setBaseItemLabelsVisible(true);  
	        
			renderer.setSeriesPaint(0, new Color(0, 255, 255));// 计划柱子的颜色为青色
			renderer.setSeriesOutlinePaint(0, Color.BLACK);// 边框为黑色
			renderer.setSeriesPaint(1, new Color(0, 255, 0));// 实报柱子的颜色为绿色
			renderer.setSeriesOutlinePaint(1, Color.red);// 边框为红色
			
	        plot.setRenderer(renderer);  
	        
	        // 设置柱的透明度  
	        plot.setForegroundAlpha(1.0f);  
	        
	       //设置背景透明度（0~1）  
	       plot.setBackgroundAlpha(0.9f);  
	       
	       File file = new File(getStorePath(),destFile+".jpg");
	       //输出文件  
	       FileOutputStream fos = new FileOutputStream(file);  
	       //用ChartUtilities工具输出  
	       ChartUtilities.writeChartAsJPEG(fos, chart, width, height);  
	       fos.close();  
	       
	       return file.getName() ;
	}

	public static String create3DBarChart(String destFile,String topTitle,String xTitle,String yTtile
			,CategoryDataset dataset) throws IOException{
		Font xfont = new Font("宋体", Font.PLAIN, 12);
		JFreeChart chart = ChartFactory.createBarChart3D(
	               topTitle,//"图书销售统计表",     //图表标题  
	               xTitle,//"图书",             //目录轴的显示标签  
	               yTtile ,//"销量",             //数值轴的显示标签  
	               dataset,      //数据  
	               PlotOrientation.VERTICAL,    //图表方向垂直 , PlotOrientation.HORIZONTAL, //图表方向水平  
	               true,             //是否显示图例  
	               true,            //是否显示工具提示  
	               true             //是否生成URL  
	       );  
		
		// 设置图标题的字体
		Font font = new Font("黑体", Font.CENTER_BASELINE, 20);
		chart.getTitle().setFont(font);
		// 设置图片底部字体
		chart.getLegend().setItemFont(xfont);

		CategoryPlot plot = chart.getCategoryPlot();// 获得图表区域对象
		// X 轴
		// 设置图表的纵轴和横轴org.jfree.chart.axis.CategoryAxis
		org.jfree.chart.axis.CategoryAxis domainAxis = plot.getDomainAxis();
		domainAxis.setLowerMargin(0.1);// 设置距离图片左端距离此时为10%
		domainAxis.setUpperMargin(0.1);// 设置距离图片右端距离此时为百分之10
		domainAxis.setCategoryLabelPositionOffset(10);// 图表横轴与标签的距离(10像素)
		domainAxis.setCategoryMargin(0.2);// 横轴标签之间的距离20%
		
		// domainAxis.setMaximumCategoryLabelLines(1);
		// domainAxis.setMaximumCategoryLabelWidthRatio(0);
		domainAxis.setLabelFont(xfont);// X轴标题
		domainAxis.setTickLabelFont(xfont);// X轴数值
		domainAxis.setTickLabelPaint(Color.BLUE); // 字体颜色
		domainAxis.setCategoryLabelPositions(CategoryLabelPositions.STANDARD); // 横轴上的label斜显示

		// 设定柱子的属性
		org.jfree.chart.axis.ValueAxis rangeAxis = plot.getRangeAxis();
		rangeAxis.setUpperMargin(0.1);// 设置最高的一个柱与图片顶端的距离(最高柱的10%)
		rangeAxis.setLabelFont(xfont);// Y轴标题
		rangeAxis.setTickLabelFont(xfont);// Y轴数值
		rangeAxis.setLabelPaint(Color.BLUE); // 字体颜色
		rangeAxis.setTickLabelFont(xfont);
		// 设置图表的颜色
		org.jfree.chart.renderer.category.BarRenderer3D renderer;
		renderer = new org.jfree.chart.renderer.category.BarRenderer3D();
		renderer.setBaseOutlinePaint(Color.red);
		renderer.setSeriesPaint(0, new Color(0, 255, 255));// 计划柱子的颜色为青色
		renderer.setSeriesOutlinePaint(0, Color.BLACK);// 边框为黑色
		renderer.setSeriesPaint(1, new Color(0, 255, 0));// 实报柱子的颜色为绿色
		renderer.setSeriesOutlinePaint(1, Color.red);// 边框为红色
		renderer.setItemMargin(0.1);// 组内柱子间隔为组宽的10%

		// 显示每个柱的数值，并修改该数值的字体属性
//		renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
//		renderer.setItemLabelFont(new Font("黑体", Font.BOLD, 12));// 12号黑体加粗
//		renderer.setItemLabelPaint(Color.black);// 字体为黑色
//		renderer.setItemLabelsVisible(true);
		
		plot.setRenderer(renderer);// 使用我们设计的效果

		// 设置纵横坐标的显示位置
		plot.setDomainAxisLocation(AxisLocation.BOTTOM_OR_LEFT);// 学校显示在下端(柱子竖直)或左侧(柱子水平)
		plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_LEFT); // 人数显示在下端(柱子水平)或左侧(柱子竖直)
		File file = new File(getStorePath(),destFile+".png");
		ChartUtilities.saveChartAsPNG(file, chart, 400, 300);// 把报表保存为文件
		
		return file.getName();
	}
	
	public static String getStorePath(){
		if(DEFAULT_STORE_PATH == null){
			DEFAULT_STORE_PATH =  ConfigUtil.get("chart.store.path");
			File file = new File(DEFAULT_STORE_PATH);
			if(!file.exists() || !file.isDirectory()){
				file.mkdirs();
			}
		}
		return DEFAULT_STORE_PATH;
	}
	
	public static String createSimpleBarChart(boolean lablevisible,String destFile,String topTitle,String xTitle,String yTtile
			,CategoryDataset dataset,int width,int height) throws IOException{
		  
		JFreeChart chart = ChartFactory.createBarChart (  
				   topTitle,     //图表标题  
	               xTitle,             //目录轴的显示标签  
	               yTtile ,   
	               dataset,      //数据  
	               //PlotOrientation.HORIZONTAL, //图表方向水平  
	              PlotOrientation.VERTICAL,    //图表方向垂直  
	               true,             //是否显示图例  
	               false,            //是否显示工具提示  
	               false             //是否生成URL  
	       );  
	       //设置标题及标题字体  
	       chart.setTitle(new TextTitle(topTitle,new Font("黑体",Font.ITALIC,22)));  
	       //建一个图例  
	       //LegendTitle legendTitle = chart.getLegend(0);  
	       //设置图例字体  
	       //legendTitle.setItemFont(new Font("宋体",Font.BOLD,14));  
	       //获取柱状图plot对象  
	       CategoryPlot plot = (CategoryPlot) chart.getPlot();  
	       //设置柱型的颜色  
	       //plot.getRenderer().setSeriesPaint(0, Color.blue);  
	       //取得横轴  
	       CategoryAxis categoryAxis = plot.getDomainAxis();  
	       //设置横轴的字体  
	       categoryAxis.setLabelFont(new Font("宋体",Font.BOLD,22));  
	       //设置分类标签以45度倾斜  
	       //categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);  
	       //设置分类标签字体  
	       categoryAxis.setTickLabelFont(new Font("宋体",Font.BOLD,22));  
	       
	       categoryAxis.setTickLabelsVisible(false);
	       
	       //取得纵轴  
	       NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();  
	       //设置纵轴的字体  
	       numberAxis.setLabelFont(new Font("宋体",Font.BOLD,22));  
	       //设置背景透明度（0~1）  
	       plot.setBackgroundAlpha(0.9f);  
	       
	      // BarRenderer renderer = (BarRenderer) plot.getRenderer() ;//new BarRenderer();
	      // renderer.setItemMargin(0.0);
	       
	       BarRenderer renderer = new BarRenderer();  
	        renderer.setIncludeBaseInRange(true); // 显示每个柱的数值，并修改该数值的字体属性  
	        renderer  
	                .setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());  
	        //renderer.setDrawBarOutline(true); // 设置柱子边框可见  
	        renderer.setItemMargin(0.0);
	        //renderer.setMaximumBarWidth(0.5);//设置条形柱最大宽度  
	        renderer.setBaseItemLabelsVisible(true, true);  
	        renderer.setShadowVisible(false);
	        
	       plot.setRenderer(renderer);  
	       
	       File file = new File(getStorePath(),destFile+".jpg");
	       //输出文件  
	       FileOutputStream fos = new FileOutputStream(file);  
	       //用ChartUtilities工具输出  
	       ChartUtilities.writeChartAsJPEG(fos, chart, width, height);  
	       fos.close();  
	       
	       return file.getName() ;
	}
	
	public static String createPieDemo(String destFile, DefaultPieDataset dataset)    
    {    
        JFreeChart chart = ChartFactory.createPieChart3D("speciality", dataset, true, true, true);    
            
        PiePlot plot = (PiePlot) chart.getPlot();
        //设置饼状图体里的的各个标签字体
        plot.setLabelFont(new Font("宋体", 0, 11));  
        
        
        
        //设置图表下方的图例说明字体
        chart.getLegend().setItemFont(new Font("宋体", 0, 11));
        
        File file = new File(getStorePath(),destFile+".jpg");
        FileOutputStream fos = null;
	       //输出文件  
        try {    
        	fos = new FileOutputStream(file);  
            ChartUtilities.writeChartAsJPEG(fos,0.5f,chart,400,300,null);    
        } catch (Exception e) {    
            // TODO 自动生成 catch 块    
            e.printStackTrace();    
        } finally    
        	{    
            try {    
                fos.close();    
            } catch (IOException e) {    
                // TODO 自动生成 catch 块    
                e.printStackTrace();    
            }    
        }  
        return file.getName();
    }     
	
}
